Find numbers with even number of digits¶
Time: O(NLog(LogM)); Space: O(LogM); easy
Given an array nums of integers, return how many of them contain an even number of digits.
Example 1:
Input: nums = [12,345,2,6,7896]
Output: 2
Explanation:
contains 2 digits (even number of digits).
5 contains 3 digits (odd number of digits).
contains 1 digit (odd number of digits).
contains 1 digit (odd number of digits).
96 contains 4 digits (even number of digits).
Therefore only 12 and 7896 contain an even number of digits.
Example 2:
Input: nums = [555,901,482,1771]
Output: 1
Explanation:
Only 1771 contains an even number of digits.
Notes:
1 <= len(nums) <= 500
1 <= nums[i] <= 10^5
Hints:
How to compute the number of digits of a number?
Divide the number by 10 again and again to get the number of digits.
[1]:
import bisect
class Solution1(object):
"""
Time: O(NLog(LogM)), N the length of nums, M is the max value of nums
Space: O(LogM)
"""
def __init__(self):
M = 10**5
self.__lookup = [0]
i = 10
while i < M:
self.__lookup.append(i)
i *= 10
self.__lookup.append(i)
def findNumbers(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
def digit_count(n):
return bisect.bisect_right(self.__lookup, n)
return sum(digit_count(n) % 2 == 0 for n in nums)
[3]:
s = Solution1()
nums = [12,345,2,6,7896]
assert s.findNumbers(nums) == 2
nums = [555,901,482,1771]
assert s.findNumbers(nums) == 1
[4]:
class Solution2(object):
"""
Time: O(NLog(LogM)), N the length of nums, M is the max value of nums
Space: O(LogM)
"""
def findNumbers(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
def digit_count(n):
result = 0
while n:
n //= 10
result += 1
return result
return sum(digit_count(n) % 2 == 0 for n in nums)
[5]:
s = Solution2()
nums = [12,345,2,6,7896]
assert s.findNumbers(nums) == 2
nums = [555,901,482,1771]
assert s.findNumbers(nums) == 1
[6]:
class Solution3(object):
"""
Time: O(nlogm), n the length of nums, m is the max value of nums
Space: O(logm)
"""
def findNumbers(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return sum(len(str(n)) % 2 == 0 for n in nums)
[7]:
s = Solution3()
nums = [12,345,2,6,7896]
assert s.findNumbers(nums) == 2
nums = [555,901,482,1771]
assert s.findNumbers(nums) == 1